package br.com.assinchronus.negocio;

import br.com.assinchronus.componentes.Casa;
import br.com.assinchronus.componentes.Peao;
import br.com.assinchronus.componentes.Dama;
import br.com.assinchronus.componentes.Pecas;
import br.com.assinchronus.negocio.RegraGeral;
import br.com.assinchronus.negocio.RegraPeao;

public class RegraFinal {

	private FinalEnum FinalEnum;
	int peaoBranco = 0, peaoPreto = 0, damaBranco = 0, damaPreto = 0;
	private int peaoBrancoEmpate = 0, peaoPretoEmpate = 0, damaBrancoEmpate = 0, damaPretoEmpate = 0;
	private RegraGeral regra = new RegraGeral();
	private RegraPeao rp = new RegraPeao();
	private int jogadasEmpate = 6;
	private boolean empate = false;

	@SuppressWarnings("static-access")
	public FinalEnum verificaFinal(Casa[] tab, int cor) {
		boolean imobilizado = true;
		contaPecas(tab);
		
		System.out.println("PB: "+peaoBranco+" Anterior: "+peaoBrancoEmpate);
		System.out.println("PP: "+peaoPreto+" Anterior: "+peaoPretoEmpate);
		System.out.println("DB: "+damaBranco+" Anterior: "+damaBrancoEmpate);
		System.out.println("DP: "+damaPreto+" Anterior: "+damaPretoEmpate);
		
		if (peaoBranco + damaBranco == 0) {
			return FinalEnum.VITORIA_PRETO;
		}
		if (peaoPreto + damaPreto == 0) {
			return FinalEnum.VITORIA_BRANCO;
		}
		if (cor == Pecas.BRANCA && peaoBranco + damaBranco < 4) {
			// verificar imobilização das peças brancas
			System.out.println("Menos de 4 peças brancas.");
			if (regra.verificaObrigatoria(tab, cor).isEmpty()) {
				System.out.println("Não tinha jogada obrigatoria para o branco.");
				for (int i = 1; i < 36; i++) {
					if (i % 9 == 0 || (tab[i].getPeca() == null || tab[i].getPeca().getCor() != cor)) {
						continue;
					}
					if (tab[i].getPeca() instanceof Peao && tab[i].getPeca().getCor() == cor) {
						System.out.println("Deve analisar um peao branco aqui. Casa: " + i);
						if ((i + 5) > 0 && (i + 5) < 37 && (i + 5) % 9 != 0 && rp.verificaJogada(tab[i], tab[i + 5], tab, false) != JogadasEnum.INVALIDA) {
							System.out.println("pode mover!");
							imobilizado = false;
							break;
						}
						if ((i + 4) > 0 && (i + 4) < 37 && (i + 4) % 9 != 0 && rp.verificaJogada(tab[i], tab[i + 4], tab, false) != JogadasEnum.INVALIDA) {
							System.out.println("pode mover!");
							imobilizado = false;
							break;
						}
					} else if (tab[i].getPeca() instanceof Dama && tab[i].getPeca().getCor() == cor) {
						System.out.println("Ignorar uma dama branca aqui.");
						imobilizado = false;
						break;
					}
				}
				if (imobilizado) {
					System.out.println("teoricamente, neste ponto o jogador branco está imobilizado!");
					return FinalEnum.VITORIA_PRETO;
				}
			} else {
				System.out.println("Tinha jogada obrigatoria para o branco.");
			}
			// se imobilizado retorna vitoria preto
		}
		if (cor == Pecas.PRETA && peaoPreto + damaPreto < 4) {
			// verificar imobilização das peças pretas
			System.out.println("Menos de 4 peças pretas.");
			if (regra.verificaObrigatoria(tab, cor).isEmpty()) {
				System.out.println("Não tinha jogada obrigatoria para o preto.");
				for (int i = 35; i > 0; i--) {
					if (i % 9 == 0 || (tab[i].getPeca() == null || tab[i].getPeca().getCor() != cor)) {
						continue;
					}
					if (tab[i].getPeca() instanceof Peao && tab[i].getPeca().getCor() == cor) {
						System.out.println("Deve analisar um peao preto aqui. Casa: " + i);
						if ((i - 5) > 0 && (i - 5) < 37 && (i - 5) % 9 != 0 && rp.verificaJogada(tab[i], tab[i - 5], tab, false) != JogadasEnum.INVALIDA) {
							System.out.println("pode mover!");
							imobilizado = false;
							break;
						}
						if ((i - 4) > 0 && (i - 4) < 37 && (i - 4) % 9 != 0 && rp.verificaJogada(tab[i], tab[i - 4], tab, false) != JogadasEnum.INVALIDA) {
							System.out.println("pode mover!");
							imobilizado = false;
							break;
						}
					} else if (tab[i].getPeca() instanceof Dama && tab[i].getPeca().getCor() == cor) {
						System.out.println("Ignorar uma dama preta aqui.");
						imobilizado = false;
						break;
					}
				}
				if (imobilizado) {
					System.out.println("teoricamente, neste ponto o jogador preto está imobilizado!");
					return FinalEnum.VITORIA_BRANCO;
				}
			} else {
				System.out.println("Tinha jogada obrigatoria para o preto.");
			}
			// se imobilizado retorna vitoria branco
		}
		if(!empate){
			System.out.println("Não tinha empate antes.");
			if(situacaoEmpate()){
				System.out.println("Agora tem empate!");
				peaoBrancoEmpate = peaoBranco;
				peaoPretoEmpate = peaoPreto;
				damaBrancoEmpate = damaBranco;
				damaPretoEmpate = damaPreto;
				empate = true;
			}
		}else{
			System.out.println("Já tinha empate antes.");
			if(peaoBrancoEmpate == peaoBranco && peaoPretoEmpate == peaoPreto && damaBrancoEmpate == damaBranco && damaPretoEmpate == damaPreto){
				System.out.println("Continua com empate!");
				jogadasEmpate--;
				System.out.println("Jogadas para empatar: "+jogadasEmpate);
				if(jogadasEmpate <= 0){
					return FinalEnum.EMPATE;
				}else{
					return FinalEnum.NORMAL;
				}
			}else{
				empate = false;
				System.out.println("Saiu da situação de empate.");
				return FinalEnum.NORMAL;
			}
		}
		return FinalEnum.NORMAL;
	}

	protected void contaPecas(Casa[] tab) {
		peaoBranco = 0;
		peaoPreto = 0;
		damaBranco = 0;
		damaPreto = 0;
		for (int i = 35; i >= 1; i--) {
			if (i % 9 != 0) {
				if (tab[i].getPeca() != null) {
					if (tab[i].getPeca() instanceof Peao) {
						if (tab[i].getPeca().getCor() == Pecas.PRETA)
							peaoPreto++;
						if (tab[i].getPeca().getCor() == Pecas.BRANCA)
							peaoBranco++;
					} else {
						if (tab[i].getPeca().getCor() == Pecas.PRETA)
							damaPreto++;
						if (tab[i].getPeca().getCor() == Pecas.BRANCA)
							damaBranco++;
					}
				}
			}
		}
	}


	private Boolean situacaoEmpate() {
		if (damaBranco == 2 && damaPreto == 2 && peaoBranco == 0 && peaoPreto == 0)
			return true;
		if (damaBranco == 1 && damaPreto == 1 && peaoBranco == 0 && peaoPreto == 0)
			return true;
		if (damaBranco == 2 && damaPreto == 1 && peaoPreto == 1 && peaoBranco == 0)
			return true;
		if (damaPreto == 2 && damaBranco == 1 && peaoBranco == 1 && peaoPreto == 0)
			return true;
		if (damaBranco == 1 && damaPreto == 1 && peaoPreto == 1 && peaoBranco == 0)
			return true;
		if (damaPreto == 1 && damaBranco == 1 && peaoBranco == 1 && peaoPreto == 0)
			return true;
		if (damaBranco == 2 && damaPreto == 1 && peaoBranco == 0 && peaoPreto == 0)
			return true;
		if (damaPreto == 2 && damaBranco == 1 && peaoBranco == 0 && peaoPreto == 0)
			return true;
		return false;
	}

}
